// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本，
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3

package 安全变量类

import (
	"bytes"
	"sync/atomic"

	gconv "gitee.com/go_888/extends/goframe/gconv"
)

// X结构_布尔 是一个用于并发安全操作布尔类型的结构体。 md5:1d3e571c42d4a013
type X结构_布尔 struct {
	value int32
}

var (
	bytesTrue  = []byte("true")
	bytesFalse = []byte("false")
)

// NewBool 创建并返回一个针对布尔类型的并发安全对象，
// 初始化值为 `value`。
// md5:d6d603ef4fb898a9
func X创建布尔(值 ...bool) *X结构_布尔 {
	t := &X结构_布尔{}
	if len(值) > 0 {
		if 值[0] {
			t.value = 1
		} else {
			t.value = 0
		}
	}
	return t
}

// Clone 克隆并返回一个新的布尔类型的并发安全对象。 md5:097dd9b0b48ac960
func (v *X结构_布尔) X浅拷贝对象() *X结构_布尔 {
	return X创建布尔(v.X取值())
}

// Set 原子地将 `value` 存储到 t.value 中，并返回 t.value 的旧值。 md5:2ce98b05d0290b37
func (v *X结构_布尔) X设置值(值 bool) (旧值 bool) {
	if 值 {
		旧值 = atomic.SwapInt32(&v.value, 1) == 1
	} else {
		旧值 = atomic.SwapInt32(&v.value, 0) == 1
	}
	return
}

// X取值原子性地加载并返回t.value。 md5:429a11b89436cc12
func (v *X结构_布尔) X取值() bool {
	return atomic.LoadInt32(&v.value) > 0
}

// Cas 执行针对值的比较并交换操作。 md5:4c2d06b4167bee48
func (v *X结构_布尔) X比较并交换(旧值, 新值 bool) (已交换 bool) {
	var oldInt32, newInt32 int32
	if 旧值 {
		oldInt32 = 1
	}
	if 新值 {
		newInt32 = 1
	}
	return atomic.CompareAndSwapInt32(&v.value, oldInt32, newInt32)
}

// String 实现了 String 接口，用于字符串打印。 md5:9f0b8c0bcf2362d3
func (v *X结构_布尔) String() string {
	if v.X取值() {
		return "true"
	}
	return "false"
}

// MarshalJSON 实现了接口 MarshalJSON 以供 json.Marshal 使用。 md5:43c3b36e60a18f9a
func (v X结构_布尔) MarshalJSON() ([]byte, error) {
	if v.X取值() {
		return bytesTrue, nil
	}
	return bytesFalse, nil
}

// UnmarshalJSON实现了json.Unmarshal接口的UnmarshalJSON方法。 md5:f6766b88cf3d63c2
func (v *X结构_布尔) UnmarshalJSON(b []byte) error {
	v.X设置值(gconv.X取布尔(bytes.Trim(b, `"`)))
	return nil
}

// UnmarshalValue 是一个接口实现，用于将任何类型的值设置为 `v`。 md5:f1b49be4502b95a4
func (v *X结构_布尔) UnmarshalValue(值 interface{}) error {
	v.X设置值(gconv.X取布尔(值))
	return nil
}

// X深拷贝实现当前类型的深拷贝接口。 md5:9cfbcb08109f6ce1
func (v *X结构_布尔) X深拷贝() interface{} {
	if v == nil {
		return nil
	}
	return X创建布尔(v.X取值())
}
